home *** CD-ROM | disk | FTP | other *** search
/ 3D Games (Spidla) / 3dhry1.iso / mAz Lite 1.0 / cam3rd.wdl < prev    next >
Encoding:
Text File  |  2003-03-17  |  4.1 KB  |  96 lines

  1. // 3rd person camera with line of sight at the top of the player's head which means the
  2. // player's head stays at the center of the view. Also gives a stable view when the camera
  3. // wants to go into an obstruction and has camera-to-player zoom.
  4. var camera_max_dist = 160; // distance limit for camera range adjustment
  5. var temp2[3];
  6. var camera_dist[3] = 90,0,0; // new default value for desired camera distance to player 
  7. function zoom_view_3rd() // press (+=) key to zoom out, shift(+=) to zoom in (only in 3rd person)
  8. { if (KEY_SHIFT)
  9. { camera_dist.X -= .1*camera_max_dist;
  10. if (camera_dist.X < .1*camera_max_dist) { camera_dist.X = .1*camera_max_dist;}
  11. } else
  12. { camera_dist.X += .1*camera_max_dist;
  13. if (camera_dist.X > camera_max_dist) { camera_dist.X = camera_max_dist;}
  14. }
  15. }
  16. ON_EQUALS zoom_view_3rd; // hope the += key doesn't conflict with anything
  17. function move_view_3rd() // the old function flickers when the camera wants to go into the wall
  18. {
  19. if ((_camera == 0) && (player != NULL))
  20. {
  21. CAMERA.DIAMETER = 0; // make the camera passable
  22. CAMERA.genius = player;
  23. CAMERA.pan += 0.2 * ang(player.pan-CAMERA.pan);
  24. // tilt the camera differently if we are using a vehicle
  25. if ( (player._MOVEMODE == _MODE_PLANE)| |(player._MOVEMODE == _MODE_CHOPPER))
  26. {
  27. CAMERA.tilt += 0.2 * ang(player.tilt-CAMERA.tilt);
  28. }
  29. else // walking, swimming etc.
  30. {
  31. CAMERA.tilt += 0.2 * ang(head_angle.tilt-CAMERA.tilt);
  32. }
  33.  
  34. // Merlinson start of my hack for the camera blocked by obstacles, adds 1 trace per frame normally
  35. vec_set(temp, temp_cdist); // length of temp is set to temp_cdist.X
  36. temp2.PAN = player.PAN; // want to do both pan and tilt in one rotate
  37. temp2.TILT = head_angle.tilt; // player's pan and head_angle's tilt
  38. temp2.ROLL = 0;
  39. vec_rotate(temp, temp2); // temp now has player's pan and head_angle's tilt
  40. vec_set(temp2, player.X); // temp2 will become the desired camera position
  41. vec_sub(temp2, temp); // temp2 is temp_cdist.X behind the player view
  42. trace_mode = ignore_me + ignore_passable; // set up trace mode options 
  43. result = trace(player.X, temp2); // check for line of sight from player to temp2
  44. if (result > 0) // temp2 is blocked by something, maybe a wall
  45. { vec_scale(temp, .8); // reducing temp will move temp2 closer to player
  46. temp_cdist.X *= .8; // reduce temp_cdist.X by 20% for next pass
  47. }
  48. else // temp2 location can see the player
  49. { if (temp_cdist.X < camera_dist.X) // we can try to back away from the player
  50. { vec_set(temp2, player.X); // we're going to recalculate temp2
  51. vec_scale(temp, 1.05); // increase distance 5%
  52. vec_sub(temp2, temp); // temp2 is 5% farther away
  53. trace_mode = ignore_me + ignore_passable; // trace mode options
  54. result = trace(player.X, temp2); // check for line of sight again
  55. if (result > 0) // something is blocking, can't back up
  56. { vec_scale(temp, 1.0/1.05); // restore temp and don't change temp_cdist.X
  57. }
  58. else // the camera can move further back
  59. { temp_cdist.X *= 1.05; // increase temp_cdist.X by 5% for next pass
  60. }
  61. }
  62. if (temp_cdist.X > camera_dist.X) // temp_cdist.X is too big or we zoomed in
  63. { temp_cdist.X = camera_dist.X; // limit the max value of temp_cdist.X
  64. }
  65. }
  66. // the camera responds slowly and smooths the jerkiness of temp2's location changes
  67. CAMERA.X += 0.4*(player.X - temp.X - CAMERA.X);
  68. CAMERA.Y += 0.4*(player.Y - temp.Y - CAMERA.Y);
  69. // got the camera height from trying to match the 1st person function's eye height
  70. // but it came out about shoulder height, so I fudged it higher a bit
  71. // now the camera is right at the top of his head (on the guard model)
  72. temp.X = player.Z + player.MIN_Z + 2.1*eye_height_up*(player.MAX_Z - player.MIN_Z);
  73. CAMERA.Z += 0.3*(temp.X - temp.Z - CAMERA.Z);
  74. // check to see if camera is located in a passable block
  75. result = ent_content(NULL,CAMERA.X);
  76.  
  77. // Merlinson end of my hack
  78. if (result == CONTENT_PASSABLE)
  79. {
  80. if (FOG_COLOR != _FOG_UNDERWATER)
  81. {
  82. current_fog_index = FOG_COLOR; // save old fog
  83. FOG_COLOR = _FOG_UNDERWATER; // set fog color to underwater fog
  84. }
  85. }
  86. else
  87. {
  88. if (FOG_COLOR == _FOG_UNDERWATER)
  89. {
  90. // else restore current_fog_index
  91. FOG_COLOR = 1;
  92. }
  93. }
  94. person_3rd = 1;
  95. }
  96. }